package _4lists.src.stack;


/**
 * @className: LinkedListStack
 * @description:
 * @author: myself
 * @date: 2025/7/24 14:48
 * @version: 0.1
 * @since: JDK17
 */

public class LinkedListStack<E> {
    static class Node<E>{
        E value;
        Node<E> next;

        public Node(E value, Node<E> next) {
            this.value = value;
            this.next = next;
        }
    }

    private int capacity;//定义数组容量
    private int size=0;//定义实际大小
    private Node<E> head = new Node<>(null, null);//创建一个哨兵，无需像队列一样创建出两个，栈只是对一段进行的操作

    public LinkedListStack(int capacity) {
        this.capacity = capacity;
    }

    //判断是否为空
    public boolean isEmpty() {
        return size == 0;
        //或者return head.next==null;
    }

    //判断是否已满
    public boolean isFull() {
        return size == capacity;
    }

    //向栈顶添加元素
    public boolean push(E value) {
        if (isFull()) {
            return false;
        }
        //向栈顶添加新的元素，head是哨兵，也是空节点
        //需要让新的元素指向head.next即可添加到头部，成为真正意义上的头节点
        head.next = new Node<>(value, head.next);
        size++;
        return true;
    }

    //查看栈顶元素
    public E peek() {
        if (isEmpty()) {
            return null;
        }
        Node<E> first = head.next;//获取栈顶节点
        return first.value;//返回栈顶节点中的值
    }

    //查看并且去除栈顶元素
    public E pop() {
        if (isEmpty()) {
            return null;
        }
        Node<E> first = head.next;//获取栈顶节点
        head.next = first.next;//移除栈顶结点
        size--;//实际容量减少
        return first.value;//返回栈顶节点中的值
    }
}
